//package com.kzy.demoadmin.web.exception;
//
//import com.kzy.demoadmin.web.entity.Result;
//import lombok.extern.slf4j.Slf4j;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.web.bind.annotation.ControllerAdvice;
//import org.springframework.web.bind.annotation.ExceptionHandler;
//import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.bind.annotation.RestControllerAdvice;
//
//import javax.servlet.http.HttpServletRequest;
//
///**
// * 全局异常处理器
// */
//@RestControllerAdvice
//@Slf4j
//@ControllerAdvice(basePackages = "com.kzy.demoadmin.web.controller")// 指定要拦截的包位置
//public class GlobalExceptionHandler {
//
//
//    // 统一异常处理（除自定义异常外所有异常）@ExceptionHandler，主要用于Exception
//    @ExceptionHandler(Exception.class)
//    @ResponseBody
//    public Result error(HttpServletRequest request, Exception e) {
//        log.error("异常信息:", e);
//        return Result.error("系统异常");
//    }
//
//    /**
//     * 自定义异常处理
//     *
//     * @param request
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(CustomException.class)// 指定要拦截的异常类型，另外一边抛出，这边捕获到
//    @ResponseBody
//    public Result customError(HttpServletRequest request, CustomException e) {
//        return Result.error(e.getMsg());
//    }
//}
package com.kzy.demoadmin.web.exception;

import com.kzy.demoadmin.web.entity.Result;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Description:
 * 全局异常捕获类
 * 所有的异常都会在这个类中处理
 *
 * @author houyi
 * @version 1.0
 * @date 2020/1/22 20:50
 * @since JDK 1.8
 */
@ControllerAdvice
@Slf4j
@Hidden
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * 捕获自定义的几种异常
     *
     * @param ex
     * @return 异常码和异常信息封装的ResultData对象
     */
    @ExceptionHandler(value = BizException.class)
    public Result handlerBizException(Exception ex){

        // 向下转型使BizException的自定义的不同于父类Exception的方法可以使用
        BizException bizException = (BizException)ex;

        // 获得异常码和异常信息
        int exCode = bizException.getExceptionCode();
        String exMsg = bizException.getExceptionMsg();

        // 将异常码和异常信息封装成通用数据返回类型
        Result result = Result.error(exCode, exMsg);

        // 对异常做日志记录，方便项目正式运行时发生异常后寻找异常发生点
        log.error(exCode + ":" +exMsg,bizException);

        // 向前端返回数据
        return result;
    }

    /**
     * 系统抛出的异常
     * @param ex
     * @return 固定异常码10002 和 异常信息封装的ResultData对象
     */
    @ExceptionHandler(value = Exception.class)
    public Result handlerException(Exception ex){

        // 对所以其他异常，统一异常码为10002，并封装
        Result result = Result.error(10002,ex.getMessage());

        // 日志记录
        log.error(10002 + ":" +ex.getMessage(),ex);

        // 返回数据
        return result;
    }

}